def main(INVA, ENA, A, ENB, B, F0, F1, CarryIn):
	
	if F0==0 and F1==0:
		AND=1
		OR=0
		NOT=0
		SUMA=0
	if F0==0 and F1==1:
		AND==0
		OR==1
		NOT==0
		SUMA==0
	if F0==1 and F1==0:
		AND==0
		OR==0
		NOT==1
		SUMA==0
	if F0==1 and F1==1:
		AND==0
		OR==0
		NOT==0
		SUMA==1
		
	varA=operacionXOR(operacionAND(A, ENA), INVA)
	varB=operacionAND(B, ENB)
	auxAND=operacionAND(operacionAND(varA, varB), AND)
	auxOR=operacionAND(operacionOR(varA, varB), OR)
	auxNOT=operacionAND(operacionNOT(B), NOT)
	auxSUMA=operacionSUMA(varA, varB, CarryIn)#la operacionSUMA devuelve una lista, el resultado de sumar y si se genera un acarreo o no
	carry=auxSUMA[1]						  #aca se guarda en una variable si hubo acarreo o no
	if SUMA==0:
		carry=0
	auxSUMA=operacionAND(auxSUMA[0], SUMA)	  #aca se fija si el decodificador activo la funcion SUMA o no
	resultado=operacionOR(operacionOR(auxAND, auxOR),operacionOR(auxNOT, auxSUMA))
	
	
	
	return [resultado, carry]
	
	
def operacionOR(a, b):
	if a==1 or b==1:
		return 1
	else:
		return 0
		
def operacionAND(a, b):
	if a==0 or b==0:
		return 0
	else:
		return 1
		
def operacionNOT(a):
	if a==0:
		return 1
	else:
		return 0
	
def operacionSUMA(a,b,carry):
	if a==0:
		if b==0:
			if carry==0:
				return [0,0]
			if carry==1:
				return [1,0]
		if b==1:
			if carry==0:
				return [1,0]
			if carry==1:
				return [0,1]
	if a==1:
		if b==0:
			if carry==0:
				return [1,0]
			if carry==1:
				return [0,1]
		if b==1:
			if carry==0:
				return [0,1]
			if carry==1:
				return [1,1]
			
def operacionXOR(a,b):
	return operacionOR(operacionAND(a,operacionNOT(b)),operacionAND(operacionNOT(a),b))
